¶

Машинное обучение. ВМК МГУ¶

Практическое задание 7: Кластеризация. Методы снижения размерности.¶

Уровень: **Исследовательский (Research)**¶

О формате сдачи¶

🔷 При решении ноутбука используйте данный шаблон

✅ Можно добавлять новые ячейки любых типов
❌ Не нужно удалять текстовые ячейки c разметкой частей ноутбука и формулировками заданий


🔷 При оценивании задач учитывается код

✅ Задания, в которых необходим код, обычно помечаются фразами "Your code here"/"Ваш код" и аналогичными
❌ Ответы на вопросы без сопутствующего кода оцениваются в 0 баллов
❌ Наличе работоспособного кода в ноутбуке, если на сказано иного, обязательно

🔷 При оценивании задач учитываются выводы

✅ Задания, в которых необходимы выводы, обычно помечаются фразами Вывод"/"Ответ на вопрос"/"Ваш текст" и аналогичными
✅ Обычно выводы подразумевают под собой текстовый ответ (можно писать markdown, latex).
✅ Сопутствующие изображения, графики, таблички - приветствуются!
❌ При отсутствии выводов задание не засчитается на полный балл


В этом задании вы..:

  • Познакомитесь с одним способом визуализации процесса обучения
  • Сравните между собой результаты разных способов кластеризации
  • Посмотрите и реализуете несколько метрик качества кластеризации
  • Попробуете разные методы снижения размерности

**Примерное время выполнения (execution time/время выполнения, если нажать run all) всех ячеек ноутбука при правильной реализации: 60 минут **


Перед началом выполнения переведите ноутбук в Доверенный режим (Trusted) для корректного отображения изображений:

In [1]:
%config Completer.use_jedi = False
%load_ext autoreload
%autoreload 2

Подготовка рабочей среды¶

Сначала установим нужные нам версии библиотек. Мы гарантируем, что в данных версиях задание будет корректно отрабатывать.

После установки нужных версий, возможно, нужно перезагрузить среду (runtime), но скорее всего вам это не понадобится

На скачивание файла и установку понадобится не более 5 минут.

**Важно!**

Устанавливать нужные версии нужно каждый раз, когда создается новый рантайм. Например, если вы 2 часа подряд делаете это задание, то подготовить библиотеки достаточно 1 раз. Но если вы, например, начали в понедельник, затем закрыли/выключили ноутбук, то при продолжении в среду, вам нужно будет запустить рантайм заново и следовательно заново установить библиотеки.

**Важно!** Если вы предпочитаете делать практические задания на своем личном ноутбуке, то проверьте, что вы установили рабочее окружение в соответствии с гайдом.pdf)


**Важно!** В этом задании мы будем использовать полное виртуальное окружение, так как понадобятся библиотеки torch и tensorflow

Обратите внимание, что установка torch и tensorflow через pipможет сломать ваше окружение, особенно если вы используете GPU. Выполняйте их установку в соответствии с Вашей конфигурацией системы или в отдельном виртуальном окружении

In [2]:
# !!! Данный блок будет работать только в Google-Colab !!!
! gdown 19ZRLAdlNBI5OScrbxXzO3iaWJSkJlXeA
! pip install -r /content/requirements_2024_25_for_colab_full.txt
Downloading...
From: https://drive.google.com/uc?id=19ZRLAdlNBI5OScrbxXzO3iaWJSkJlXeA
To: /content/requirements_2024_25_for_colab_full.txt
100% 424/424 [00:00<00:00, 1.56MB/s]
Collecting catboost==1.2.7 (from -r /content/requirements_2024_25_for_colab_full.txt (line 1))
  Downloading catboost-1.2.7-cp311-cp311-manylinux2014_x86_64.whl.metadata (1.2 kB)
Collecting gdown==5.1.0 (from -r /content/requirements_2024_25_for_colab_full.txt (line 2))
  Downloading gdown-5.1.0-py3-none-any.whl.metadata (5.7 kB)
Collecting h5py==3.11.0 (from -r /content/requirements_2024_25_for_colab_full.txt (line 3))
  Downloading h5py-3.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (2.5 kB)
Requirement already satisfied: hyperopt==0.2.7 in /usr/local/lib/python3.11/dist-packages (from -r /content/requirements_2024_25_for_colab_full.txt (line 4)) (0.2.7)
Collecting ipympl==0.9.4 (from -r /content/requirements_2024_25_for_colab_full.txt (line 5))
  Downloading ipympl-0.9.4-py3-none-any.whl.metadata (8.7 kB)
Requirement already satisfied: ipywidgets==7.7.1 in /usr/local/lib/python3.11/dist-packages (from -r /content/requirements_2024_25_for_colab_full.txt (line 6)) (7.7.1)
Collecting keras==3.4.1 (from -r /content/requirements_2024_25_for_colab_full.txt (line 7))
  Downloading keras-3.4.1-py3-none-any.whl.metadata (5.8 kB)
Collecting lightgbm==4.4.0 (from -r /content/requirements_2024_25_for_colab_full.txt (line 8))
  Downloading lightgbm-4.4.0-py3-none-manylinux_2_28_x86_64.whl.metadata (19 kB)
Collecting matplotlib==3.7.1 (from -r /content/requirements_2024_25_for_colab_full.txt (line 9))
  Downloading matplotlib-3.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (5.6 kB)
Requirement already satisfied: matplotlib-inline==0.1.7 in /usr/local/lib/python3.11/dist-packages (from -r /content/requirements_2024_25_for_colab_full.txt (line 10)) (0.1.7)
Collecting numpy==1.26.4 (from -r /content/requirements_2024_25_for_colab_full.txt (line 11))
  Downloading numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (61 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 61.0/61.0 kB 539.1 kB/s eta 0:00:00
Collecting pandas==2.1.4 (from -r /content/requirements_2024_25_for_colab_full.txt (line 12))
  Downloading pandas-2.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (18 kB)
Collecting pep8==1.7.1 (from -r /content/requirements_2024_25_for_colab_full.txt (line 13))
  Downloading pep8-1.7.1-py2.py3-none-any.whl.metadata (22 kB)
Collecting plotly==5.15.0 (from -r /content/requirements_2024_25_for_colab_full.txt (line 14))
  Downloading plotly-5.15.0-py2.py3-none-any.whl.metadata (7.0 kB)
Collecting pycodestyle==2.12.1 (from -r /content/requirements_2024_25_for_colab_full.txt (line 15))
  Downloading pycodestyle-2.12.1-py2.py3-none-any.whl.metadata (4.5 kB)
Collecting pytest==7.4.4 (from -r /content/requirements_2024_25_for_colab_full.txt (line 16))
  Downloading pytest-7.4.4-py3-none-any.whl.metadata (7.9 kB)
Collecting scikit-image==0.23.2 (from -r /content/requirements_2024_25_for_colab_full.txt (line 17))
  Downloading scikit_image-0.23.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (14 kB)
Collecting scikit-learn==1.3.2 (from -r /content/requirements_2024_25_for_colab_full.txt (line 18))
  Downloading scikit_learn-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (11 kB)
Collecting scipy==1.13.1 (from -r /content/requirements_2024_25_for_colab_full.txt (line 19))
  Downloading scipy-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (60 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 60.6/60.6 kB 2.3 MB/s eta 0:00:00
Collecting seaborn==0.13.1 (from -r /content/requirements_2024_25_for_colab_full.txt (line 20))
  Downloading seaborn-0.13.1-py3-none-any.whl.metadata (5.4 kB)
Collecting torch==2.3.1 (from -r /content/requirements_2024_25_for_colab_full.txt (line 21))
  Downloading torch-2.3.1-cp311-cp311-manylinux1_x86_64.whl.metadata (26 kB)
Collecting torchvision==0.18.1 (from -r /content/requirements_2024_25_for_colab_full.txt (line 22))
  Downloading torchvision-0.18.1-cp311-cp311-manylinux1_x86_64.whl.metadata (6.6 kB)
Collecting tqdm==4.66.5 (from -r /content/requirements_2024_25_for_colab_full.txt (line 23))
  Downloading tqdm-4.66.5-py3-none-any.whl.metadata (57 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 57.6/57.6 kB 2.7 MB/s eta 0:00:00
Collecting umap-learn==0.5.6 (from -r /content/requirements_2024_25_for_colab_full.txt (line 24))
  Downloading umap_learn-0.5.6-py3-none-any.whl.metadata (21 kB)
Collecting xgboost==2.1.1 (from -r /content/requirements_2024_25_for_colab_full.txt (line 25))
  Downloading xgboost-2.1.1-py3-none-manylinux_2_28_x86_64.whl.metadata (2.1 kB)
Requirement already satisfied: graphviz in /usr/local/lib/python3.11/dist-packages (from catboost==1.2.7->-r /content/requirements_2024_25_for_colab_full.txt (line 1)) (0.20.3)
Requirement already satisfied: six in /usr/local/lib/python3.11/dist-packages (from catboost==1.2.7->-r /content/requirements_2024_25_for_colab_full.txt (line 1)) (1.17.0)
Requirement already satisfied: beautifulsoup4 in /usr/local/lib/python3.11/dist-packages (from gdown==5.1.0->-r /content/requirements_2024_25_for_colab_full.txt (line 2)) (4.13.4)
Requirement already satisfied: filelock in /usr/local/lib/python3.11/dist-packages (from gdown==5.1.0->-r /content/requirements_2024_25_for_colab_full.txt (line 2)) (3.18.0)
Requirement already satisfied: requests[socks] in /usr/local/lib/python3.11/dist-packages (from gdown==5.1.0->-r /content/requirements_2024_25_for_colab_full.txt (line 2)) (2.32.3)
Requirement already satisfied: networkx>=2.2 in /usr/local/lib/python3.11/dist-packages (from hyperopt==0.2.7->-r /content/requirements_2024_25_for_colab_full.txt (line 4)) (3.4.2)
Requirement already satisfied: future in /usr/local/lib/python3.11/dist-packages (from hyperopt==0.2.7->-r /content/requirements_2024_25_for_colab_full.txt (line 4)) (1.0.0)
Requirement already satisfied: cloudpickle in /usr/local/lib/python3.11/dist-packages (from hyperopt==0.2.7->-r /content/requirements_2024_25_for_colab_full.txt (line 4)) (3.1.1)
Requirement already satisfied: py4j in /usr/local/lib/python3.11/dist-packages (from hyperopt==0.2.7->-r /content/requirements_2024_25_for_colab_full.txt (line 4)) (0.10.9.7)
Requirement already satisfied: ipython-genutils in /usr/local/lib/python3.11/dist-packages (from ipympl==0.9.4->-r /content/requirements_2024_25_for_colab_full.txt (line 5)) (0.2.0)
Requirement already satisfied: ipython<9 in /usr/local/lib/python3.11/dist-packages (from ipympl==0.9.4->-r /content/requirements_2024_25_for_colab_full.txt (line 5)) (7.34.0)
Requirement already satisfied: pillow in /usr/local/lib/python3.11/dist-packages (from ipympl==0.9.4->-r /content/requirements_2024_25_for_colab_full.txt (line 5)) (11.1.0)
Requirement already satisfied: traitlets<6 in /usr/local/lib/python3.11/dist-packages (from ipympl==0.9.4->-r /content/requirements_2024_25_for_colab_full.txt (line 5)) (5.7.1)
Requirement already satisfied: ipykernel>=4.5.1 in /usr/local/lib/python3.11/dist-packages (from ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (6.17.1)
Requirement already satisfied: widgetsnbextension~=3.6.0 in /usr/local/lib/python3.11/dist-packages (from ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (3.6.10)
Requirement already satisfied: jupyterlab-widgets>=1.0.0 in /usr/local/lib/python3.11/dist-packages (from ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (3.0.14)
Requirement already satisfied: absl-py in /usr/local/lib/python3.11/dist-packages (from keras==3.4.1->-r /content/requirements_2024_25_for_colab_full.txt (line 7)) (1.4.0)
Requirement already satisfied: rich in /usr/local/lib/python3.11/dist-packages (from keras==3.4.1->-r /content/requirements_2024_25_for_colab_full.txt (line 7)) (13.9.4)
Requirement already satisfied: namex in /usr/local/lib/python3.11/dist-packages (from keras==3.4.1->-r /content/requirements_2024_25_for_colab_full.txt (line 7)) (0.0.8)
Requirement already satisfied: optree in /usr/local/lib/python3.11/dist-packages (from keras==3.4.1->-r /content/requirements_2024_25_for_colab_full.txt (line 7)) (0.15.0)
Requirement already satisfied: ml-dtypes in /usr/local/lib/python3.11/dist-packages (from keras==3.4.1->-r /content/requirements_2024_25_for_colab_full.txt (line 7)) (0.4.1)
Requirement already satisfied: packaging in /usr/local/lib/python3.11/dist-packages (from keras==3.4.1->-r /content/requirements_2024_25_for_colab_full.txt (line 7)) (24.2)
Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.11/dist-packages (from matplotlib==3.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 9)) (1.3.2)
Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.11/dist-packages (from matplotlib==3.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 9)) (0.12.1)
Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.11/dist-packages (from matplotlib==3.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 9)) (4.57.0)
Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.11/dist-packages (from matplotlib==3.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 9)) (1.4.8)
Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.11/dist-packages (from matplotlib==3.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 9)) (3.2.3)
Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.11/dist-packages (from matplotlib==3.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 9)) (2.8.2)
Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.11/dist-packages (from pandas==2.1.4->-r /content/requirements_2024_25_for_colab_full.txt (line 12)) (2025.2)
Requirement already satisfied: tzdata>=2022.1 in /usr/local/lib/python3.11/dist-packages (from pandas==2.1.4->-r /content/requirements_2024_25_for_colab_full.txt (line 12)) (2025.2)
Requirement already satisfied: tenacity>=6.2.0 in /usr/local/lib/python3.11/dist-packages (from plotly==5.15.0->-r /content/requirements_2024_25_for_colab_full.txt (line 14)) (9.1.2)
Requirement already satisfied: iniconfig in /usr/local/lib/python3.11/dist-packages (from pytest==7.4.4->-r /content/requirements_2024_25_for_colab_full.txt (line 16)) (2.1.0)
Requirement already satisfied: pluggy<2.0,>=0.12 in /usr/local/lib/python3.11/dist-packages (from pytest==7.4.4->-r /content/requirements_2024_25_for_colab_full.txt (line 16)) (1.5.0)
Requirement already satisfied: imageio>=2.33 in /usr/local/lib/python3.11/dist-packages (from scikit-image==0.23.2->-r /content/requirements_2024_25_for_colab_full.txt (line 17)) (2.37.0)
Requirement already satisfied: tifffile>=2022.8.12 in /usr/local/lib/python3.11/dist-packages (from scikit-image==0.23.2->-r /content/requirements_2024_25_for_colab_full.txt (line 17)) (2025.3.30)
Requirement already satisfied: lazy-loader>=0.4 in /usr/local/lib/python3.11/dist-packages (from scikit-image==0.23.2->-r /content/requirements_2024_25_for_colab_full.txt (line 17)) (0.4)
Requirement already satisfied: joblib>=1.1.1 in /usr/local/lib/python3.11/dist-packages (from scikit-learn==1.3.2->-r /content/requirements_2024_25_for_colab_full.txt (line 18)) (1.4.2)
Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.11/dist-packages (from scikit-learn==1.3.2->-r /content/requirements_2024_25_for_colab_full.txt (line 18)) (3.6.0)
Requirement already satisfied: typing-extensions>=4.8.0 in /usr/local/lib/python3.11/dist-packages (from torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21)) (4.13.2)
Requirement already satisfied: sympy in /usr/local/lib/python3.11/dist-packages (from torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21)) (1.13.1)
Requirement already satisfied: jinja2 in /usr/local/lib/python3.11/dist-packages (from torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21)) (3.1.6)
Requirement already satisfied: fsspec in /usr/local/lib/python3.11/dist-packages (from torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21)) (2025.3.2)
Collecting nvidia-cuda-nvrtc-cu12==12.1.105 (from torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21))
  Downloading nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl.metadata (1.5 kB)
Collecting nvidia-cuda-runtime-cu12==12.1.105 (from torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21))
  Downloading nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl.metadata (1.5 kB)
Collecting nvidia-cuda-cupti-cu12==12.1.105 (from torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21))
  Downloading nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl.metadata (1.6 kB)
Collecting nvidia-cudnn-cu12==8.9.2.26 (from torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21))
  Downloading nvidia_cudnn_cu12-8.9.2.26-py3-none-manylinux1_x86_64.whl.metadata (1.6 kB)
Collecting nvidia-cublas-cu12==12.1.3.1 (from torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21))
  Downloading nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl.metadata (1.5 kB)
Collecting nvidia-cufft-cu12==11.0.2.54 (from torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21))
  Downloading nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl.metadata (1.5 kB)
Collecting nvidia-curand-cu12==10.3.2.106 (from torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21))
  Downloading nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl.metadata (1.5 kB)
Collecting nvidia-cusolver-cu12==11.4.5.107 (from torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21))
  Downloading nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl.metadata (1.6 kB)
Collecting nvidia-cusparse-cu12==12.1.0.106 (from torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21))
  Downloading nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl.metadata (1.6 kB)
Collecting nvidia-nccl-cu12==2.20.5 (from torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21))
  Downloading nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_x86_64.whl.metadata (1.8 kB)
Collecting nvidia-nvtx-cu12==12.1.105 (from torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21))
  Downloading nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl.metadata (1.7 kB)
Collecting triton==2.3.1 (from torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21))
  Downloading triton-2.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (1.4 kB)
Requirement already satisfied: numba>=0.51.2 in /usr/local/lib/python3.11/dist-packages (from umap-learn==0.5.6->-r /content/requirements_2024_25_for_colab_full.txt (line 24)) (0.60.0)
Requirement already satisfied: pynndescent>=0.5 in /usr/local/lib/python3.11/dist-packages (from umap-learn==0.5.6->-r /content/requirements_2024_25_for_colab_full.txt (line 24)) (0.5.13)
Requirement already satisfied: nvidia-nvjitlink-cu12 in /usr/local/lib/python3.11/dist-packages (from nvidia-cusolver-cu12==11.4.5.107->torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21)) (12.5.82)
Requirement already satisfied: debugpy>=1.0 in /usr/local/lib/python3.11/dist-packages (from ipykernel>=4.5.1->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (1.8.0)
Requirement already satisfied: jupyter-client>=6.1.12 in /usr/local/lib/python3.11/dist-packages (from ipykernel>=4.5.1->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (6.1.12)
Requirement already satisfied: nest-asyncio in /usr/local/lib/python3.11/dist-packages (from ipykernel>=4.5.1->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (1.6.0)
Requirement already satisfied: psutil in /usr/local/lib/python3.11/dist-packages (from ipykernel>=4.5.1->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (5.9.5)
Requirement already satisfied: pyzmq>=17 in /usr/local/lib/python3.11/dist-packages (from ipykernel>=4.5.1->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (24.0.1)
Requirement already satisfied: tornado>=6.1 in /usr/local/lib/python3.11/dist-packages (from ipykernel>=4.5.1->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (6.4.2)
Requirement already satisfied: setuptools>=18.5 in /usr/local/lib/python3.11/dist-packages (from ipython<9->ipympl==0.9.4->-r /content/requirements_2024_25_for_colab_full.txt (line 5)) (75.2.0)
Collecting jedi>=0.16 (from ipython<9->ipympl==0.9.4->-r /content/requirements_2024_25_for_colab_full.txt (line 5))
  Downloading jedi-0.19.2-py2.py3-none-any.whl.metadata (22 kB)
Requirement already satisfied: decorator in /usr/local/lib/python3.11/dist-packages (from ipython<9->ipympl==0.9.4->-r /content/requirements_2024_25_for_colab_full.txt (line 5)) (4.4.2)
Requirement already satisfied: pickleshare in /usr/local/lib/python3.11/dist-packages (from ipython<9->ipympl==0.9.4->-r /content/requirements_2024_25_for_colab_full.txt (line 5)) (0.7.5)
Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /usr/local/lib/python3.11/dist-packages (from ipython<9->ipympl==0.9.4->-r /content/requirements_2024_25_for_colab_full.txt (line 5)) (3.0.51)
Requirement already satisfied: pygments in /usr/local/lib/python3.11/dist-packages (from ipython<9->ipympl==0.9.4->-r /content/requirements_2024_25_for_colab_full.txt (line 5)) (2.18.0)
Requirement already satisfied: backcall in /usr/local/lib/python3.11/dist-packages (from ipython<9->ipympl==0.9.4->-r /content/requirements_2024_25_for_colab_full.txt (line 5)) (0.2.0)
Requirement already satisfied: pexpect>4.3 in /usr/local/lib/python3.11/dist-packages (from ipython<9->ipympl==0.9.4->-r /content/requirements_2024_25_for_colab_full.txt (line 5)) (4.9.0)
Requirement already satisfied: llvmlite<0.44,>=0.43.0dev0 in /usr/local/lib/python3.11/dist-packages (from numba>=0.51.2->umap-learn==0.5.6->-r /content/requirements_2024_25_for_colab_full.txt (line 24)) (0.43.0)
Requirement already satisfied: notebook>=4.4.1 in /usr/local/lib/python3.11/dist-packages (from widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (6.5.7)
Requirement already satisfied: soupsieve>1.2 in /usr/local/lib/python3.11/dist-packages (from beautifulsoup4->gdown==5.1.0->-r /content/requirements_2024_25_for_colab_full.txt (line 2)) (2.6)
Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.11/dist-packages (from jinja2->torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21)) (3.0.2)
Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.11/dist-packages (from requests[socks]->gdown==5.1.0->-r /content/requirements_2024_25_for_colab_full.txt (line 2)) (3.4.1)
Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.11/dist-packages (from requests[socks]->gdown==5.1.0->-r /content/requirements_2024_25_for_colab_full.txt (line 2)) (3.10)
Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.11/dist-packages (from requests[socks]->gdown==5.1.0->-r /content/requirements_2024_25_for_colab_full.txt (line 2)) (2.3.0)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.11/dist-packages (from requests[socks]->gdown==5.1.0->-r /content/requirements_2024_25_for_colab_full.txt (line 2)) (2025.1.31)
Requirement already satisfied: PySocks!=1.5.7,>=1.5.6 in /usr/local/lib/python3.11/dist-packages (from requests[socks]->gdown==5.1.0->-r /content/requirements_2024_25_for_colab_full.txt (line 2)) (1.7.1)
Requirement already satisfied: markdown-it-py>=2.2.0 in /usr/local/lib/python3.11/dist-packages (from rich->keras==3.4.1->-r /content/requirements_2024_25_for_colab_full.txt (line 7)) (3.0.0)
Requirement already satisfied: mpmath<1.4,>=1.1.0 in /usr/local/lib/python3.11/dist-packages (from sympy->torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21)) (1.3.0)
Requirement already satisfied: parso<0.9.0,>=0.8.4 in /usr/local/lib/python3.11/dist-packages (from jedi>=0.16->ipython<9->ipympl==0.9.4->-r /content/requirements_2024_25_for_colab_full.txt (line 5)) (0.8.4)
Requirement already satisfied: jupyter-core>=4.6.0 in /usr/local/lib/python3.11/dist-packages (from jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (5.7.2)
Requirement already satisfied: mdurl~=0.1 in /usr/local/lib/python3.11/dist-packages (from markdown-it-py>=2.2.0->rich->keras==3.4.1->-r /content/requirements_2024_25_for_colab_full.txt (line 7)) (0.1.2)
Requirement already satisfied: argon2-cffi in /usr/local/lib/python3.11/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (23.1.0)
Requirement already satisfied: nbformat in /usr/local/lib/python3.11/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (5.10.4)
Requirement already satisfied: nbconvert>=5 in /usr/local/lib/python3.11/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (7.16.6)
Requirement already satisfied: Send2Trash>=1.8.0 in /usr/local/lib/python3.11/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (1.8.3)
Requirement already satisfied: terminado>=0.8.3 in /usr/local/lib/python3.11/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (0.18.1)
Requirement already satisfied: prometheus-client in /usr/local/lib/python3.11/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (0.21.1)
Requirement already satisfied: nbclassic>=0.4.7 in /usr/local/lib/python3.11/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (1.2.0)
Requirement already satisfied: ptyprocess>=0.5 in /usr/local/lib/python3.11/dist-packages (from pexpect>4.3->ipython<9->ipympl==0.9.4->-r /content/requirements_2024_25_for_colab_full.txt (line 5)) (0.7.0)
Requirement already satisfied: wcwidth in /usr/local/lib/python3.11/dist-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython<9->ipympl==0.9.4->-r /content/requirements_2024_25_for_colab_full.txt (line 5)) (0.2.13)
Requirement already satisfied: platformdirs>=2.5 in /usr/local/lib/python3.11/dist-packages (from jupyter-core>=4.6.0->jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (4.3.7)
Requirement already satisfied: notebook-shim>=0.2.3 in /usr/local/lib/python3.11/dist-packages (from nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (0.2.4)
Requirement already satisfied: bleach!=5.0.0 in /usr/local/lib/python3.11/dist-packages (from bleach[css]!=5.0.0->nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (6.2.0)
Requirement already satisfied: defusedxml in /usr/local/lib/python3.11/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (0.7.1)
Requirement already satisfied: jupyterlab-pygments in /usr/local/lib/python3.11/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (0.3.0)
Requirement already satisfied: mistune<4,>=2.0.3 in /usr/local/lib/python3.11/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (3.1.3)
Requirement already satisfied: nbclient>=0.5.0 in /usr/local/lib/python3.11/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (0.10.2)
Requirement already satisfied: pandocfilters>=1.4.1 in /usr/local/lib/python3.11/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (1.5.1)
Requirement already satisfied: fastjsonschema>=2.15 in /usr/local/lib/python3.11/dist-packages (from nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (2.21.1)
Requirement already satisfied: jsonschema>=2.6 in /usr/local/lib/python3.11/dist-packages (from nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (4.23.0)
Requirement already satisfied: argon2-cffi-bindings in /usr/local/lib/python3.11/dist-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (21.2.0)
Requirement already satisfied: webencodings in /usr/local/lib/python3.11/dist-packages (from bleach!=5.0.0->bleach[css]!=5.0.0->nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (0.5.1)
Requirement already satisfied: tinycss2<1.5,>=1.1.0 in /usr/local/lib/python3.11/dist-packages (from bleach[css]!=5.0.0->nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (1.4.0)
Requirement already satisfied: attrs>=22.2.0 in /usr/local/lib/python3.11/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (25.3.0)
Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /usr/local/lib/python3.11/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (2024.10.1)
Requirement already satisfied: referencing>=0.28.4 in /usr/local/lib/python3.11/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (0.36.2)
Requirement already satisfied: rpds-py>=0.7.1 in /usr/local/lib/python3.11/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (0.24.0)
Requirement already satisfied: jupyter-server<3,>=1.8 in /usr/local/lib/python3.11/dist-packages (from notebook-shim>=0.2.3->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (1.16.0)
Requirement already satisfied: cffi>=1.0.1 in /usr/local/lib/python3.11/dist-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (1.17.1)
Requirement already satisfied: pycparser in /usr/local/lib/python3.11/dist-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (2.22)
Requirement already satisfied: anyio>=3.1.0 in /usr/local/lib/python3.11/dist-packages (from jupyter-server<3,>=1.8->notebook-shim>=0.2.3->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (4.9.0)
Requirement already satisfied: websocket-client in /usr/local/lib/python3.11/dist-packages (from jupyter-server<3,>=1.8->notebook-shim>=0.2.3->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (1.8.0)
Requirement already satisfied: sniffio>=1.1 in /usr/local/lib/python3.11/dist-packages (from anyio>=3.1.0->jupyter-server<3,>=1.8->notebook-shim>=0.2.3->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (1.3.1)
Downloading catboost-1.2.7-cp311-cp311-manylinux2014_x86_64.whl (98.7 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 98.7/98.7 MB 7.3 MB/s eta 0:00:00
Downloading gdown-5.1.0-py3-none-any.whl (17 kB)
Downloading h5py-3.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.4 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 5.4/5.4 MB 67.1 MB/s eta 0:00:00
Downloading ipympl-0.9.4-py3-none-any.whl (516 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 516.3/516.3 kB 31.3 MB/s eta 0:00:00
Downloading keras-3.4.1-py3-none-any.whl (1.1 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.1/1.1 MB 47.6 MB/s eta 0:00:00
Downloading lightgbm-4.4.0-py3-none-manylinux_2_28_x86_64.whl (3.6 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.6/3.6 MB 59.5 MB/s eta 0:00:00
Downloading matplotlib-3.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.6 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 11.6/11.6 MB 70.8 MB/s eta 0:00:00
Downloading numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (18.3 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 18.3/18.3 MB 42.6 MB/s eta 0:00:00
Downloading pandas-2.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (12.2 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 12.2/12.2 MB 48.1 MB/s eta 0:00:00
Downloading pep8-1.7.1-py2.py3-none-any.whl (41 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 41.5/41.5 kB 3.1 MB/s eta 0:00:00
Downloading plotly-5.15.0-py2.py3-none-any.whl (15.5 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 15.5/15.5 MB 54.6 MB/s eta 0:00:00
Downloading pycodestyle-2.12.1-py2.py3-none-any.whl (31 kB)
Downloading pytest-7.4.4-py3-none-any.whl (325 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 325.3/325.3 kB 22.5 MB/s eta 0:00:00
Downloading scikit_image-0.23.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (14.7 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 14.7/14.7 MB 53.7 MB/s eta 0:00:00
Downloading scikit_learn-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (10.9 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 10.9/10.9 MB 39.9 MB/s eta 0:00:00
Downloading scipy-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (38.6 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 38.6/38.6 MB 9.7 MB/s eta 0:00:00
Downloading seaborn-0.13.1-py3-none-any.whl (294 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 294.8/294.8 kB 19.4 MB/s eta 0:00:00
Downloading torch-2.3.1-cp311-cp311-manylinux1_x86_64.whl (779.2 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 779.2/779.2 MB 2.3 MB/s eta 0:00:00
Downloading torchvision-0.18.1-cp311-cp311-manylinux1_x86_64.whl (7.0 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 7.0/7.0 MB 80.5 MB/s eta 0:00:00
Downloading tqdm-4.66.5-py3-none-any.whl (78 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 78.4/78.4 kB 5.3 MB/s eta 0:00:00
Downloading umap_learn-0.5.6-py3-none-any.whl (85 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 85.7/85.7 kB 6.7 MB/s eta 0:00:00
Downloading xgboost-2.1.1-py3-none-manylinux_2_28_x86_64.whl (153.9 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 153.9/153.9 MB 6.8 MB/s eta 0:00:00
Downloading nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl (410.6 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 410.6/410.6 MB 2.7 MB/s eta 0:00:00
Downloading nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (14.1 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 14.1/14.1 MB 100.5 MB/s eta 0:00:00
Downloading nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (23.7 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 23.7/23.7 MB 72.9 MB/s eta 0:00:00
Downloading nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (823 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 823.6/823.6 kB 47.7 MB/s eta 0:00:00
Downloading nvidia_cudnn_cu12-8.9.2.26-py3-none-manylinux1_x86_64.whl (731.7 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 731.7/731.7 MB 788.2 kB/s eta 0:00:00
Downloading nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl (121.6 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 121.6/121.6 MB 7.2 MB/s eta 0:00:00
Downloading nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl (56.5 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 56.5/56.5 MB 11.5 MB/s eta 0:00:00
Downloading nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl (124.2 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 124.2/124.2 MB 7.6 MB/s eta 0:00:00
Downloading nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl (196.0 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 196.0/196.0 MB 6.1 MB/s eta 0:00:00
Downloading nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_x86_64.whl (176.2 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 176.2/176.2 MB 6.4 MB/s eta 0:00:00
Downloading nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (99 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 99.1/99.1 kB 7.6 MB/s eta 0:00:00
Downloading triton-2.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (168.1 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 168.1/168.1 MB 6.6 MB/s eta 0:00:00
Downloading jedi-0.19.2-py2.py3-none-any.whl (1.6 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.6/1.6 MB 57.3 MB/s eta 0:00:00
Installing collected packages: pep8, triton, tqdm, pytest, pycodestyle, plotly, nvidia-nvtx-cu12, nvidia-nccl-cu12, nvidia-cusparse-cu12, nvidia-curand-cu12, nvidia-cufft-cu12, nvidia-cuda-runtime-cu12, nvidia-cuda-nvrtc-cu12, nvidia-cuda-cupti-cu12, nvidia-cublas-cu12, numpy, jedi, scipy, pandas, nvidia-cusolver-cu12, nvidia-cudnn-cu12, h5py, xgboost, torch, scikit-learn, scikit-image, matplotlib, lightgbm, keras, gdown, torchvision, seaborn, catboost, umap-learn, ipympl
  Attempting uninstall: triton
    Found existing installation: triton 3.2.0
    Uninstalling triton-3.2.0:
      Successfully uninstalled triton-3.2.0
  Attempting uninstall: tqdm
    Found existing installation: tqdm 4.67.1
    Uninstalling tqdm-4.67.1:
      Successfully uninstalled tqdm-4.67.1
  Attempting uninstall: pytest
    Found existing installation: pytest 8.3.5
    Uninstalling pytest-8.3.5:
      Successfully uninstalled pytest-8.3.5
  Attempting uninstall: plotly
    Found existing installation: plotly 5.24.1
    Uninstalling plotly-5.24.1:
      Successfully uninstalled plotly-5.24.1
  Attempting uninstall: nvidia-nvtx-cu12
    Found existing installation: nvidia-nvtx-cu12 12.4.127
    Uninstalling nvidia-nvtx-cu12-12.4.127:
      Successfully uninstalled nvidia-nvtx-cu12-12.4.127
  Attempting uninstall: nvidia-nccl-cu12
    Found existing installation: nvidia-nccl-cu12 2.21.5
    Uninstalling nvidia-nccl-cu12-2.21.5:
      Successfully uninstalled nvidia-nccl-cu12-2.21.5
  Attempting uninstall: nvidia-cusparse-cu12
    Found existing installation: nvidia-cusparse-cu12 12.5.1.3
    Uninstalling nvidia-cusparse-cu12-12.5.1.3:
      Successfully uninstalled nvidia-cusparse-cu12-12.5.1.3
  Attempting uninstall: nvidia-curand-cu12
    Found existing installation: nvidia-curand-cu12 10.3.6.82
    Uninstalling nvidia-curand-cu12-10.3.6.82:
      Successfully uninstalled nvidia-curand-cu12-10.3.6.82
  Attempting uninstall: nvidia-cufft-cu12
    Found existing installation: nvidia-cufft-cu12 11.2.3.61
    Uninstalling nvidia-cufft-cu12-11.2.3.61:
      Successfully uninstalled nvidia-cufft-cu12-11.2.3.61
  Attempting uninstall: nvidia-cuda-runtime-cu12
    Found existing installation: nvidia-cuda-runtime-cu12 12.5.82
    Uninstalling nvidia-cuda-runtime-cu12-12.5.82:
      Successfully uninstalled nvidia-cuda-runtime-cu12-12.5.82
  Attempting uninstall: nvidia-cuda-nvrtc-cu12
    Found existing installation: nvidia-cuda-nvrtc-cu12 12.5.82
    Uninstalling nvidia-cuda-nvrtc-cu12-12.5.82:
      Successfully uninstalled nvidia-cuda-nvrtc-cu12-12.5.82
  Attempting uninstall: nvidia-cuda-cupti-cu12
    Found existing installation: nvidia-cuda-cupti-cu12 12.5.82
    Uninstalling nvidia-cuda-cupti-cu12-12.5.82:
      Successfully uninstalled nvidia-cuda-cupti-cu12-12.5.82
  Attempting uninstall: nvidia-cublas-cu12
    Found existing installation: nvidia-cublas-cu12 12.5.3.2
    Uninstalling nvidia-cublas-cu12-12.5.3.2:
      Successfully uninstalled nvidia-cublas-cu12-12.5.3.2
  Attempting uninstall: numpy
    Found existing installation: numpy 2.0.2
    Uninstalling numpy-2.0.2:
      Successfully uninstalled numpy-2.0.2
  Attempting uninstall: scipy
    Found existing installation: scipy 1.14.1
    Uninstalling scipy-1.14.1:
      Successfully uninstalled scipy-1.14.1
  Attempting uninstall: pandas
    Found existing installation: pandas 2.2.2
    Uninstalling pandas-2.2.2:
      Successfully uninstalled pandas-2.2.2
  Attempting uninstall: nvidia-cusolver-cu12
    Found existing installation: nvidia-cusolver-cu12 11.6.3.83
    Uninstalling nvidia-cusolver-cu12-11.6.3.83:
      Successfully uninstalled nvidia-cusolver-cu12-11.6.3.83
  Attempting uninstall: nvidia-cudnn-cu12
    Found existing installation: nvidia-cudnn-cu12 9.3.0.75
    Uninstalling nvidia-cudnn-cu12-9.3.0.75:
      Successfully uninstalled nvidia-cudnn-cu12-9.3.0.75
  Attempting uninstall: h5py
    Found existing installation: h5py 3.13.0
    Uninstalling h5py-3.13.0:
      Successfully uninstalled h5py-3.13.0
  Attempting uninstall: xgboost
    Found existing installation: xgboost 2.1.4
    Uninstalling xgboost-2.1.4:
      Successfully uninstalled xgboost-2.1.4
  Attempting uninstall: torch
    Found existing installation: torch 2.6.0+cu124
    Uninstalling torch-2.6.0+cu124:
      Successfully uninstalled torch-2.6.0+cu124
  Attempting uninstall: scikit-learn
    Found existing installation: scikit-learn 1.6.1
    Uninstalling scikit-learn-1.6.1:
      Successfully uninstalled scikit-learn-1.6.1
  Attempting uninstall: scikit-image
    Found existing installation: scikit-image 0.25.2
    Uninstalling scikit-image-0.25.2:
      Successfully uninstalled scikit-image-0.25.2
  Attempting uninstall: matplotlib
    Found existing installation: matplotlib 3.10.0
    Uninstalling matplotlib-3.10.0:
      Successfully uninstalled matplotlib-3.10.0
  Attempting uninstall: lightgbm
    Found existing installation: lightgbm 4.5.0
    Uninstalling lightgbm-4.5.0:
      Successfully uninstalled lightgbm-4.5.0
  Attempting uninstall: keras
    Found existing installation: keras 3.8.0
    Uninstalling keras-3.8.0:
      Successfully uninstalled keras-3.8.0
  Attempting uninstall: gdown
    Found existing installation: gdown 5.2.0
    Uninstalling gdown-5.2.0:
      Successfully uninstalled gdown-5.2.0
  Attempting uninstall: torchvision
    Found existing installation: torchvision 0.21.0+cu124
    Uninstalling torchvision-0.21.0+cu124:
      Successfully uninstalled torchvision-0.21.0+cu124
  Attempting uninstall: seaborn
    Found existing installation: seaborn 0.13.2
    Uninstalling seaborn-0.13.2:
      Successfully uninstalled seaborn-0.13.2
  Attempting uninstall: umap-learn
    Found existing installation: umap-learn 0.5.7
    Uninstalling umap-learn-0.5.7:
      Successfully uninstalled umap-learn-0.5.7
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
google-colab 1.0.0 requires pandas==2.2.2, but you have pandas 2.1.4 which is incompatible.
thinc 8.3.6 requires numpy<3.0.0,>=2.0.0, but you have numpy 1.26.4 which is incompatible.
mizani 0.13.3 requires pandas>=2.2.0, but you have pandas 2.1.4 which is incompatible.
plotnine 0.14.5 requires matplotlib>=3.8.0, but you have matplotlib 3.7.1 which is incompatible.
plotnine 0.14.5 requires pandas>=2.2.0, but you have pandas 2.1.4 which is incompatible.
torchaudio 2.6.0+cu124 requires torch==2.6.0, but you have torch 2.3.1 which is incompatible.
tensorflow 2.18.0 requires keras>=3.5.0, but you have keras 3.4.1 which is incompatible.
Successfully installed catboost-1.2.7 gdown-5.1.0 h5py-3.11.0 ipympl-0.9.4 jedi-0.19.2 keras-3.4.1 lightgbm-4.4.0 matplotlib-3.7.1 numpy-1.26.4 nvidia-cublas-cu12-12.1.3.1 nvidia-cuda-cupti-cu12-12.1.105 nvidia-cuda-nvrtc-cu12-12.1.105 nvidia-cuda-runtime-cu12-12.1.105 nvidia-cudnn-cu12-8.9.2.26 nvidia-cufft-cu12-11.0.2.54 nvidia-curand-cu12-10.3.2.106 nvidia-cusolver-cu12-11.4.5.107 nvidia-cusparse-cu12-12.1.0.106 nvidia-nccl-cu12-2.20.5 nvidia-nvtx-cu12-12.1.105 pandas-2.1.4 pep8-1.7.1 plotly-5.15.0 pycodestyle-2.12.1 pytest-7.4.4 scikit-image-0.23.2 scikit-learn-1.3.2 scipy-1.13.1 seaborn-0.13.1 torch-2.3.1 torchvision-0.18.1 tqdm-4.66.5 triton-2.3.1 umap-learn-0.5.6 xgboost-2.1.1
In [1]:
import catboost
assert(catboost.__version__ == '1.2.7')

Теперь можно приступать к выполнению задания! :)


1 О задании¶

В данной работе вам предстоит познакомится с методами машинного обучения без учителя — кластеризацией и алгоритмами снижения размерности.

Рекомендуется использовать Kaggle так как в нём корректно работают интерактивные визуализации.

Здесь перечислены основные функции и библиотеки, которые могут понадобиться Вам в процессе выполнения задания. Подключение других библиотек возможно, но нежелательно. Работа каких-либо других библиотек не гарантируется.

In [2]:
import os

import gdown

import scipy

import numpy as np

import tqdm.auto as tqdm

import matplotlib
import matplotlib.pyplot as plt
from matplotlib.offsetbox import OffsetImage, AnnotationBbox

from ipywidgets import interactive, fixed, interact_manual, IntSlider, FloatLogSlider, FloatSlider

import torch
from torchvision.datasets import CIFAR10

# Необходима преварительная установка tensorflow
from keras.applications.inception_v3 import InceptionV3, preprocess_input

import sklearn

from sklearn.decomposition import KernelPCA
from sklearn.cluster import KMeans, DBSCAN, AgglomerativeClustering

# Библиотека umap-learn, а не umap
from umap import UMAP
from sklearn.manifold import TSNE, Isomap

from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification, make_moons, make_blobs
from sklearn.preprocessing import StandardScaler, MinMaxScaler

from warnings import simplefilter
from sklearn.exceptions import ConvergenceWarning
simplefilter("ignore", category=ConvergenceWarning)

Определим вспомогательную функцию для отрисовки двумерных кластеризованных данных. При выполенении задания желательно пользоваться этой функцией для визуализации. При необходимости можете менять сигнатуру и поведение функции как вам удобно, оставляя стиль отрисовки в целом неизменным.

In [3]:
def plot_2d_data(data, labels, title='Исходные данные', cmap='tab20', ax=None):
    '''
    Отрисовка 2d scatter plot.
    :param np.ndarray data: 2d массив точек
    :param Union[list, np.ndarray] labels: список меток для каждой точки выборки
    :param str title: Заголовок графика
    :param str cmap: Цветовая палитра
    :param ax Optional[matplotlib.axes.Axes]: Оси для отрисовки графика.
        Если оси не заданы, то создаётся новая фигура и сразу же происходит её отрисовка
        Иначе, график добавляется на существуюущие оси. Отрисовки фигуры не происходит
    '''
    n_clusters = len(np.unique(labels))

    if ax is None:
        fig, ax = plt.subplots(1, 1, figsize=(10, 5))
    else:
        fig = None

    scatter = ax.scatter(
        data[:, 0], data[:, 1], c=labels,
        cmap=plt.get_cmap(cmap, n_clusters)
    )

    cbar = plt.colorbar(scatter, label='Номер кластера', ax=ax)
    cbar.set_ticks(np.min(labels) + (np.arange(n_clusters) + 0.5) * (n_clusters - 1) / n_clusters)
    cbar.set_ticklabels(np.unique(labels))

    ax.set_title(title)
    ax.grid(True)

    if fig is not None:
        fig.tight_layout()
        plt.show()

Также используйте написанные реализации из [Base] задания:

In [4]:
def silhouette_score(x, labels):
    '''
    :param np.ndarray x: Непустой двумерный массив векторов-признаков
    :param np.ndarray labels: Непустой одномерный массив меток объектов
    :return float: Коэффициент силуэта для выборки x с метками labels
    '''

    # Ваш код здесь:\(º □ º l|l)/
    unique_labels, label_counts = np.unique(labels, return_counts=True)
    if len(unique_labels) == 1:
        return 0.0

    distances = sklearn.metrics.pairwise_distances(x)
    n = len(labels)

    # Precompute cluster indices and sizes
    cluster_indices = {label: np.where(labels == label)[0] for label in unique_labels}
    cluster_sizes = {label: len(indices) for label, indices in cluster_indices.items()}

    # Precompute sum of distances for each cluster
    sum_distances = {}
    for label in unique_labels:
        sum_distances[label] = distances[:, cluster_indices[label]].sum(axis=1)

    total_silhouette = 0.0

    for i in range(n):
        label = labels[i]
        cluster_size = cluster_sizes[label]
        if cluster_size == 1:
            continue

        # Calculate s_i
        s_i = (sum_distances[label][i] - distances[i, i]) / (cluster_size - 1)

        # Calculate d_i
        other_labels = [cur_label for cur_label in unique_labels if cur_label != label]
        means = [
            sum_distances[cur_label][i] / cluster_sizes[cur_label]
            for cur_label in other_labels
        ]
        d_i = np.min(means)

        # Compute silhouette for current point
        maxim = max(s_i, d_i)
        sil_i = (d_i - s_i) / maxim if maxim != 0 else 0.0

        total_silhouette += sil_i

    return total_silhouette / n

def bcubed_score(true_labels, predicted_labels):
    '''
    :param np.ndarray true_labels: Непустой одномерный массив меток объектов
    :param np.ndarray predicted_labels: Непустой одномерный массив меток объектов
    :return float: B-Cubed для объектов с истинными метками true_labels и предсказанными метками predicted_labels
    '''

    # Ваш код здесь:\(º □ º l|l)/
    same_true = true_labels[:, None] == true_labels
    same_pred = predicted_labels[:, None] == predicted_labels
    correctness = same_true & same_pred

    correct_in_cluster = correctness.sum(axis=1)
    pred_cluster_size = same_pred.sum(axis=1)
    true_cluster_size = same_true.sum(axis=1)

    precision = np.mean(correct_in_cluster / pred_cluster_size)
    recall = np.mean(correct_in_cluster / true_cluster_size)

    if (precision + recall) == 0:
        return 0.0
    return 2 * (precision * recall) / (precision + recall)

1.1 Ещё несколько важных замечаний¶

При выполнении задания запрещено:

  1. Менять те seed, которые явно указаны в коде
  2. Менять прототипы функций, классов, методов классов
  3. Менять константы, используемые для генерации выборок

При оформлении задания обратите внимание на форматирование кода и на оформление графиков:

  • Весь код должен быть оформлен в строгом соответствии с PEP8

Графики должны быть с одной стороны понятными и информативными, а с другой стороны красивыми. Вот несколько пунктов, которые помогут удовлетворить этим требования:

  1. Все графики должны быть отрисованы в векторном формате. Обратите внимание, что смена режима графиков с динамического на статический и обратно может приводить к сбросу параметров отрисовки графиков. Переход в векторный режим можно выполнить с помощью команды matplotlib_inline.backend_inline.set_matplotlib_formats('pdf', 'svg'). Если изображения в векторном формате приводят к слишком большому размеру Jupyter Notebook можете использовать растровые изображения с высоким dpi. Напирмер, можно установить глобальный dpi в matplotlib: matplotlib.rcParams['figure.dpi'] = 300
  2. На всех графиках без исключения должна быть нарисована сетка
  3. Все графики и группы графиков должны иметь заголовок (title)
  4. При необходимости оси должны быть подписаны
  5. Если на графике отображено несколько сущностей (линии/точки/bar разных цветов, формы и так далее), то необходима исчерпывающая легенда
  6. Все линии на графиках должны быть чётко видны (нет похожих цветов или цветов, сливающихся с фоном и так далее)
  7. Масштаб по каждой оси на графике должен быть выбран правильно. Используйте масштабы log, symlog по необходимости
  8. Если отображена величина, имеющая очевидный диапазон значений (например, проценты могут быть от 0 до 100), то желательно масштабировать ось на весь диапазон значений (исключением является случай, когда вам необходимо показать малое отличие, которое незаметно в таких масштабах)
  9. Частота отметок по каждой оси должна быть тщательно подобрана, по необходимости задавайте [xy]ticks, [xy]ticklabels вручную. Подписи тиков на осях не должны сливаться как на одной оси, так и между ними
  10. Помните, что matplotlib умеет выполнять рендеринг Latex. Используйте эту возможность для написания формул в заголовках, легенде и в подписях осей
  11. Используйте красивую цветовую палитру с хорошо различимыми цветами. Примеры цветовых палитр можно посмотреть здесь. При наличи особенностей восприятия цвета можно использовать специальные палитры:
    plt.style.use('seaborn-colorblind')
    # Или
    plt.style.use('tableau-colorblind10')
    # Затем, при отрисовке графиков не используйте параметр cmap
    
  12. Графики должны быть не супер-микро и не супер-макро по размерам, так, чтобы можно было увидеть все, что нужно

2. Кластеризация "естественных" данных.¶

Синтетические данные имеют достаточно простую структуру, поэтому методы снижения размерности позволяют получать хорошее низкоразмерное представление с достаточно выраженными кластерами. Однако, реальные данные могут быть устроены существенно сложнее. Посмотрим как поведут себя методы снижения размерности на датасете с картинками CIFAR10.

Загрузим датасет. Будем использовать только часть обучающей выборки, чтобы ускорить вычисления на высокоразмерных данных.

In [5]:
cifar10_test_dataset = CIFAR10('./cifar10', train=False, download=True)
cifar10_train_dataset = CIFAR10('./cifar10', train=True, download=False)

cifar10_labels_test = np.array(cifar10_test_dataset.targets)
cifar10_labels_train = np.array(cifar10_train_dataset.targets)

cifar10_images_test = cifar10_test_dataset.data
cifar10_images_train = cifar10_train_dataset.data

cifar10_images_train, _, cifar10_labels_train, _ = train_test_split(
    cifar10_images_train, cifar10_labels_train,
    train_size=cifar10_images_test.shape[0], stratify=cifar10_labels_train, random_state=6886
)

cifar10_data_test = (cifar10_images_test.astype(np.float32) / 255.0).reshape([cifar10_images_test.shape[0], -1])
cifar10_data_train = (cifar10_images_train.astype(np.float32) / 255.0).reshape([cifar10_images_train.shape[0], -1])
Downloading https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz to ./cifar10/cifar-10-python.tar.gz
100%|██████████| 170498071/170498071 [00:01<00:00, 99240961.36it/s] 
Extracting ./cifar10/cifar-10-python.tar.gz to ./cifar10

Отобразим данные в проекции на две случайные оси. Для удобства воспользуемся здесь ещё одним вариантом динамического контента в jupyter notebook — при наведении на точку на графике будем отображать исходную картинку.

In [6]:
def plot_interactive(lowd_data, images, labels, names, n_dots=1000, image_scale=1.0):
    with matplotlib.rc_context(rc={
        'font.size': image_scale * matplotlib.rcParams['font.size'],
        'xtick.major.size': image_scale * matplotlib.rcParams['xtick.major.size'],
        'xtick.minor.size': image_scale * matplotlib.rcParams['xtick.minor.size'],
        'ytick.major.size': image_scale * matplotlib.rcParams['ytick.major.size'],
        'ytick.minor.size': image_scale * matplotlib.rcParams['ytick.minor.size'],

        'axes.linewidth': image_scale * matplotlib.rcParams['axes.linewidth'],
        'grid.linewidth': image_scale * matplotlib.rcParams['grid.linewidth'],
        'patch.linewidth': image_scale * matplotlib.rcParams['patch.linewidth'],
        'xtick.major.width': image_scale * matplotlib.rcParams['xtick.major.width'],
        'xtick.minor.width': image_scale * matplotlib.rcParams['xtick.minor.width'],
        'ytick.major.width': image_scale * matplotlib.rcParams['ytick.major.width'],
        'ytick.minor.width': image_scale * matplotlib.rcParams['ytick.minor.width'],

        'lines.markeredgewidth': image_scale * matplotlib.rcParams['lines.markeredgewidth'],
    }):
        fig, ax = plt.subplots(1, 1, figsize=(image_scale * 10, image_scale * 5))
        fig.set_dpi(300)
        ax.grid(True)

        n_clusters = len(np.unique(labels))

        scatter = plt.scatter(
            lowd_data[:n_dots, 0], lowd_data[:n_dots, 1], s=image_scale * 10,
            c=labels[:n_dots], cmap=plt.get_cmap('tab20', n_clusters), edgecolors='none'
        )

        cbar = plt.colorbar(scatter, ax=ax, label='Название кластера')
        cbar.set_ticks(np.min(labels[:n_dots]) + (np.arange(n_clusters) + 0.5) * (n_clusters - 1) / n_clusters)
        cbar.set_ticklabels(names)

        offset_image = OffsetImage(images[0], zoom=image_scale * 2.0)
        ann_bbox = AnnotationBbox(
            offset_image, (0,0), xybox=(image_scale * 50., image_scale * 50.), xycoords='data',
            boxcoords="offset points", pad=0.3, arrowprops=dict(
                arrowstyle='->, head_length={0:.2f}, head_width={1:.2f}'.format(
                    image_scale * 0.4, image_scale * 0.2
                )
            )
        )
        ax.add_artist(ann_bbox)
        ax.set_title('Распределение данных CIFAR10 в проекции на 2 случайные оси')
        ann_bbox.set_visible(False)

        def image_hover(event):
            if scatter.contains(event)[0]:
                ind, *_ = scatter.contains(event)[1]["ind"]
                w, h = fig.get_size_inches() * fig.dpi
                ws = (event.x > w / 2.) * -1 + (event.x <= w / 2.)
                hs = (event.y > h / 2.) * -1 + (event.y <= h / 2.)
                ann_bbox.xybox = (image_scale * 50.0 * ws, image_scale * 50.0 * hs)
                ann_bbox.set_visible(True)
                ann_bbox.xy =(lowd_data[ind, 0], lowd_data[ind, 1])
                offset_image.set_data(images[ind])
            else:
                ann_bbox.set_visible(False)
            fig.canvas.draw_idle()

        fig.canvas.mpl_connect('motion_notify_event', image_hover)

        plt.show()
In [7]:
%matplotlib ipympl
matplotlib.rcParams['figure.dpi'] = 300

# Для работы в Google Colab нужно выполнить специфичную магию
# Обычно, она не срабатывает с первого раза, поэтому может потребоваться
#   несколько раз выполнить ячейку и несколько раз попробовать нарисовать график
try:
    from google.colab import output
    output.enable_custom_widget_manager()
except:
    pass
In [8]:
# Если картинка окажется слишком маленькой/большой, то поменяйте image_scale на подходящее значение
plot_interactive(
    cifar10_data_train[:, [17, 64]], cifar10_images_train, cifar10_labels_train,
    cifar10_test_dataset.classes, n_dots=2000, image_scale=0.35
)
Figure

Вернёмся в статичный режим отрисовки изображений:

In [9]:
%matplotlib inline
matplotlib.rcParams['figure.dpi'] = 300

Задание 2.1 [кросспроверка, 1 балл][код]

</font> Воспользуйтесь алгоритмами снижения размерности TSNE, UMAP, Isomap, KernelPCA для визуализации картинок.

Постройте визуализацию низкоразмерного представления, полученного с помощью этих моделей — изобразите четыре графика в одной строке. Во второй строке отобразите результат применения обученных моделей на тестовой выборке. Если для данного алгоритма невозможно сделать предсказания на тестовой выборке — оставьте соответствующий график пустым. Обозначьте разными цветами разные классы объектов. Для повышения производительности можете отобразить только часть выборки на графике ($1000\text{-}2000$ объектов).

**Замечание:** обратите внимание, что все алгоритмы снижения размерности также требуют правильного масштабирования признаков, для корректной работы и интерпретируемых результатов.

In [10]:
# Ваш код здесь:\(º □ º l|l)/
In [11]:
# t-SNE для обучающей выборки
tsne = TSNE(n_components=2, random_state=42)
cifar10_tsne_train = tsne.fit_transform(cifar10_data_train[:2000])

# t-SNE для тестовой выборки
# cifar10_tsne_test = tsne.transform(cifar10_data_test[:2000]) # Нельзя сделать такое предсказание
In [12]:
# UMAP для обучающей выборки
umap_model = UMAP(n_components=2, random_state=42)
cifar10_umap_train = umap_model.fit_transform(cifar10_data_train[:2000])

# UMAP для тестовой выборки
cifar10_umap_test = umap_model.transform(cifar10_data_test[:2000])
/usr/local/lib/python3.11/dist-packages/umap/umap_.py:1945: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.
  warn(f"n_jobs value {self.n_jobs} overridden to 1 by setting random_state. Use no seed for parallelism.")
In [13]:
# Isomap для обучающей выборки
isomap = Isomap(n_components=2)
cifar10_isomap_train = isomap.fit_transform(cifar10_data_train[:2000])

# Isomap для тестовой выборки
cifar10_isomap_test = isomap.transform(cifar10_data_test[:2000])
In [14]:
# KernelPCA для обучающей выборки
kpca = KernelPCA(n_components=2, kernel='rbf', gamma=15)
cifar10_kpca_train = kpca.fit_transform(cifar10_data_train[:2000])

# KernelPCA для тестовой выборки
cifar10_kpca_test = kpca.transform(cifar10_data_test[:2000])
In [15]:
fig, axes = plt.subplots(2, 4, figsize=(20, 10))

# t-SNE
plot_2d_data(cifar10_tsne_train, cifar10_labels_train[:2000], 't-SNE Train', cmap='tab20', ax=axes[0, 0])
# plot_2d_data(cifar10_tsne_test, cifar10_labels_test[:2000], 't-SNE Test', cmap='tab20', ax=axes[1, 0]) # Нет такой функции, так как метод unsupervised

# UMAP
plot_2d_data(cifar10_umap_train, cifar10_labels_train[:2000], 'UMAP Train', cmap='tab20', ax=axes[0, 1])
plot_2d_data(cifar10_umap_test, cifar10_labels_test[:2000], 'UMAP Test', cmap='tab20', ax=axes[1, 1])

# Isomap
plot_2d_data(cifar10_isomap_train, cifar10_labels_train[:2000], 'Isomap Train', cmap='tab20', ax=axes[0, 2])
plot_2d_data(cifar10_isomap_test, cifar10_labels_test[:2000], 'Isomap Test', cmap='tab20', ax=axes[1, 2])

# KernelPCA
plot_2d_data(cifar10_kpca_train, cifar10_labels_train[:2000], 'KernelPCA Train', cmap='tab20', ax=axes[0, 3])
plot_2d_data(cifar10_kpca_test, cifar10_labels_test[:2000], 'KernelPCA Test', cmap='tab20', ax=axes[1, 3])

plt.tight_layout()
plt.show()

**Задание 2.2 [кросспроверка, 1 балл][вопрос]**¶

Опишите увиденное. Почему алгоритмы могли отработать не так, как вы ожидали?

**Ваш ответ здесь:** (o・・)ノ”(ノ<、):

1. t-SNE¶

Обучающая выборка (t-SNE Train)¶

  • Наблюдение: Точки распределены достаточно равномерно, но классы (цвета) сильно перемешаны. Визуально сложно выделить четкие кластеры.
  • Причина: t-SNE — это нелинейный метод, который хорошо сохраняет локальную структуру данных, но может искажать глобальную структуру. Если данные имеют сложную структуру или классы перекрываются, t-SNE может не справиться с их разделением.
  • Ожидание: t-SNE обычно хорошо разделяет классы, если они хорошо разделены в высокоразмерном пространстве. В данном случае, возможно, классы в исходных данных перекрываются или имеют сложную структуру.

Тестовая выборка (t-SNE Test)¶

  • Отсутствие графика: t-SNE не имеет метода transform, так как это непараметрический метод. Он не может применять обученную модель к новым данным.

2. UMAP¶

  • Наблюдение: Точки распределены компактнее, чем в t-SNE, но классы все еще сильно перемешаны. Визуально сложно выделить четкие кластеры.
  • Причина: UMAP, как и t-SNE, сохраняет локальную структуру данных, но может искажать глобальную. Если классы в исходных данных перекрываются или имеют сложную структуру, UMAP может не справиться с их разделением.
  • Ожидание: UMAP обычно лучше сохраняет глобальную структуру данных по сравнению с t-SNE, но в данном случае результаты схожи.

3. Isomap¶

  • Наблюдение: Точки распределены более равномерно, чем в t-SNE и UMAP, но классы все еще перемешаны. Визуально сложно выделить четкие кластеры.
  • Причина: Isomap сохраняет глобальную структуру данных, но может искажать локальную структуру. Если классы в исходных данных перекрываются или имеют сложную структуру, Isomap может не справиться с их разделением.
  • Ожидание: Isomap обычно хорошо сохраняет глобальную структуру данных, но в данном случае результаты схожи с t-SNE и UMAP.

4. KernelPCA¶

  • Наблюдение: Точки сгруппированы в несколько компактных кластеров, но классы (цвета) сильно перемешаны. Визуально сложно выделить четкие кластеры.
  • Причина: KernelPCA использует ядра для нелинейного снижения размерности. Если ядро или параметры выбраны неправильно, алгоритм может искажать структуру данных.
  • Ожидание: KernelPCA обычно хорошо разделяет классы, если ядро и параметры подобраны правильно. В данном случае, возможно, ядро или параметры не соответствуют структуре данных.

Почему алгоритмы могли отработать не так, как ожидалось?¶

  1. Сложная структура данных:

    • Если классы в исходных данных перекрываются или имеют сложную структуру, алгоритмы снижения размерности могут не справиться с их разделением.
    • t-SNE и UMAP сохраняют локальную структуру данных, но могут искажать глобальную. Isomap сохраняет глобальную структуру, но может искажать локальную.
  2. Неправильный выбор параметров:

    • KernelPCA чувствителен к выбору ядра и параметров. Если ядро или параметры выбраны неправильно, алгоритм может искажать структуру данных.
    • Для t-SNE и UMAP также важен выбор гиперпараметров (например, perplexity для t-SNE).
  3. Стохастичность алгоритмов:

    • t-SNE и UMAP являются стохастическими алгоритмами, что означает, что их результаты могут варьироваться от запуска к запуску. Это может объяснить различия между обучающей и тестовой выборками.
  4. Перекрытие классов:

    • Если классы в исходных данных перекрываются, алгоритмы снижения размерности могут не справиться с их разделением.

**Задание 2.3 [кросспроверка, 1 балл][вопрос]**¶

Методы снижения размерности, как и другие метрические методы испытывают трудности при работе с данными высокой размерности. Напишите как минимум две причины, почему.

**Ваш ответ здесь:** (o・・)ノ”(ノ<、):

  1. Проклятие размерности

  2. Вычислительная сложность

Один из способов решения этих проблем — перейти в другое, более репрезентативное пространство признаков, где объекты будут расположены в многообразии, которое легче представить в двумерном пространстве. Чтобы выполнить такое преобразование воспользуемся типичным подходом Transfer Learning — предобученными нейронными сетями. С помощью глубокой сети обученной на другом наборе изображений (ImageNet) мы перейдём в новое векторное пространство и затем применим методы снижения размерности.

Так как локальный подсчёт эмбеддингов изображений может занять много времени, Вы можете попробовать скачать их c помощью gdown:

In [16]:
gdown.download(id='16UgWo1Emt9ar1O4h2Xxed0ZpJZ0OG5V-', output='cifar10_deep_features.npy')
Downloading...
From (original): https://drive.google.com/uc?id=16UgWo1Emt9ar1O4h2Xxed0ZpJZ0OG5V-
From (redirected): https://drive.google.com/uc?id=16UgWo1Emt9ar1O4h2Xxed0ZpJZ0OG5V-&confirm=t&uuid=d1ef8eb2-f003-442e-97ed-9c29f21fab2b
To: /content/cifar10_deep_features.npy
100%|██████████| 164M/164M [00:02<00:00, 68.4MB/s]
Out[16]:
'cifar10_deep_features.npy'
In [17]:
FEATURES_PATH = './cifar10_deep_features.npy'

if not os.path.exists(FEATURES_PATH):
    deep_cnn = InceptionV3(weights='imagenet', include_top=False, input_shape=(139, 139, 3))

    cifar10_tensors_test = torch.nn.functional.interpolate(torch.tensor(
        cifar10_images_test.transpose(0, 3, 1, 2)
    ), size=139).numpy().transpose(0, 2, 3, 1).astype(np.float32)
    cifar10_tensors_train = torch.nn.functional.interpolate(torch.tensor(
        cifar10_images_train.transpose(0, 3, 1, 2)
    ), size=139).numpy().transpose(0, 2, 3, 1).astype(np.float32)

    cifar10_deep_features_test = deep_cnn.predict(
        preprocess_input(cifar10_tensors_test)
    ).mean(axis=(1, 2)).reshape([cifar10_tensors_test.shape[0], -1])
    cifar10_deep_features_train = deep_cnn.predict(
        preprocess_input(cifar10_tensors_train)
    ).mean(axis=(1, 2)).reshape([cifar10_tensors_train.shape[0], -1])

    np.save(FEATURES_PATH, [cifar10_deep_features_test, cifar10_deep_features_train])
else:
    cifar10_deep_features_test, cifar10_deep_features_train = np.load(FEATURES_PATH, allow_pickle=True)

**Задание 2.4 [кросспроверка, 2 баллa][код]**¶

Используйте выделенные признаки для обучения алгоритмов из предыдущего пункта. Постройте графики. Замечание из пункта 2.1 остаётся в силе.

In [18]:
# Ваш код здесь:\(º □ º l|l)/
In [19]:
# t-SNE для обучающей выборки
tsne = TSNE(n_components=2, random_state=42)
cifar10_tsne_train = tsne.fit_transform(cifar10_deep_features_train[:2000])

# t-SNE для тестовой выборки
# cifar10_tsne_test = tsne.fit_transform(cifar10_deep_features_test[:2000])
In [20]:
# UMAP для обучающей выборки
umap_model = UMAP(n_components=2, random_state=42)
cifar10_umap_train = umap_model.fit_transform(cifar10_deep_features_train[:2000])

# UMAP для тестовой выборки
cifar10_umap_test = umap_model.transform(cifar10_deep_features_test[:2000])
/usr/local/lib/python3.11/dist-packages/umap/umap_.py:1945: UserWarning: n_jobs value 1 overridden to 1 by setting random_state. Use no seed for parallelism.
  warn(f"n_jobs value {self.n_jobs} overridden to 1 by setting random_state. Use no seed for parallelism.")
In [21]:
# Isomap для обучающей выборки
isomap = Isomap(n_components=2)
cifar10_isomap_train = isomap.fit_transform(cifar10_deep_features_train[:2000])

# Isomap для тестовой выборки
cifar10_isomap_test = isomap.transform(cifar10_deep_features_test[:2000])
In [22]:
# KernelPCA для обучающей выборки
kpca = KernelPCA(n_components=2, kernel='rbf', gamma=15)
cifar10_kpca_train = kpca.fit_transform(cifar10_deep_features_train[:2000])

# KernelPCA для тестовой выборки
cifar10_kpca_test = kpca.transform(cifar10_deep_features_test[:2000])
In [23]:
fig, axes = plt.subplots(2, 4, figsize=(20, 10))

# t-SNE
plot_2d_data(cifar10_tsne_train, cifar10_labels_train[:2000], 't-SNE Train', cmap='tab20', ax=axes[0, 0])
# plot_2d_data(cifar10_tsne_test, cifar10_labels_test[:2000], 't-SNE Test', cmap='tab20', ax=axes[1, 0])

# UMAP
plot_2d_data(cifar10_umap_train, cifar10_labels_train[:2000], 'UMAP Train', cmap='tab20', ax=axes[0, 1])
plot_2d_data(cifar10_umap_test, cifar10_labels_test[:2000], 'UMAP Test', cmap='tab20', ax=axes[1, 1])

# Isomap
plot_2d_data(cifar10_isomap_train, cifar10_labels_train[:2000], 'Isomap Train', cmap='tab20', ax=axes[0, 2])
plot_2d_data(cifar10_isomap_test, cifar10_labels_test[:2000], 'Isomap Test', cmap='tab20', ax=axes[1, 2])

# KernelPCA
plot_2d_data(cifar10_kpca_train, cifar10_labels_train[:2000], 'KernelPCA Train', cmap='tab20', ax=axes[0, 3])
plot_2d_data(cifar10_kpca_test, cifar10_labels_test[:2000], 'KernelPCA Test', cmap='tab20', ax=axes[1, 3])

plt.tight_layout()
plt.show()